/**
 * @author
 * Júlio Zynger
 * DRE: 110092466
 */
package model;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map.Entry;
import java.util.Set;

@SuppressWarnings("rawtypes")
public class Estado implements Comparable{
	private LinkedHashMap<String, Estado> transicoes;
	private String nome;
	private boolean estadoFinal;
		
	public Estado(String nome, LinkedHashMap<String, Estado> transicoes){
		this.nome = nome;
		this.transicoes = transicoes;
		this.estadoFinal = false;
	}
	
	
	public HashMap<String, Estado> getTransicoes() {
		return transicoes;
	}
	
	public Set<String> getKeysByValue(Estado value) {
	     Set<String> keys = new HashSet<String>();
	     for (Entry<String, Estado> entry : this.transicoes.entrySet()) {
	         if (entry.getValue().equals(value)) {
	             keys.add(entry.getKey());
	         }
	     }
	     return keys;
	}

	public void setTransicoes(LinkedHashMap<String, Estado> transicoes) {
		this.transicoes = transicoes;
	}
	
	public boolean isFinal() {
		return estadoFinal;
	}
	
	public void setFinal(boolean isFinal) {
		this.estadoFinal = isFinal;
	}
	
	public String getNome() {
		return nome;
	}
	
	public String getLinguagem () {
		String ling = "";
		for (Iterator<String> iterator = transicoes.keySet().iterator(); iterator.hasNext();) {
			String s = (String) iterator.next();
			if (iterator.hasNext()) ling += s + "L(" + transicoes.get(s) + ")U";
			else ling += s.toString() + "L(" + transicoes.get(s) + ")"; //fim do conjunto de transicoes
		}
		if (isFinal()) ling = ling.concat("U(ε)"); //se for estado final, preciso adicionar o epsilon as unioes
		
		return ling;
	}

	@Override
	public String toString() {
		String nome = this.nome;
		/*if(this.estadoFinal) nome += "É final";
		else nome += "Não é final"*/;
		
		return nome;
	}


	@Override
	public int compareTo(Object arg0) {
		if(this.getLinguagem().equals(((Estado) arg0).getLinguagem())) return 0;
		else return -1;
	}
	
}
